package main

import "fmt"

// main
//
//	@Description: 环形单向链表，添加/删除 节点件单向环形链表(golang).png
func main() {
	head := CreateHeadNode()
	AddElement(head, "tom")
	AddElement(head, "jack")
	AddElement(head, "rose")
	Print(head)
	fmt.Println()
	head, _ = Delete(head, "jack")
	Print(head)
}

type Node struct {
	Ele  interface{}
	Next *Node
}

// CreateHeadNode
//
//	@Description: 创建头结点
//	@return *Node
func CreateHeadNode() *Node {
	node := &Node{
		Ele: nil,
	}
	return node
}
func AddElement(head *Node, ele interface{}) {
	node := &Node{
		Ele: ele,
	}
	if head.Next == nil { //是添加的第一个元素
		head.Ele = node.Ele
		head.Next = head //自己构成一个环
	} else {
		//找到头节点的前一个节点
		temp := head
		for {
			if temp.Next == head {
				break
			}
			temp = temp.Next //不停的往后移动
		}
		//加入
		temp.Next = node //当前节点的next->新的节点
		node.Next = head //新的节点的next->头结点
	}
}
func Print(head *Node) {
	temp := head
	if temp.Next == nil {
		return
	}
	for {
		fmt.Printf("ele=%v ptr=%p next=%p \n", temp.Ele, temp, temp.Next)
		if temp.Next == head {
			break
		}
		temp = temp.Next //移动
	}
}

// Delete
//
//	@Description:  删除节点
//	@param head
//	@param ele
//	@return n
//	@return err
func Delete(head *Node, ele interface{}) (n *Node, err error) {
	if head == nil || head.Next == head {
		return nil, fmt.Errorf("删除失败，链表为空或只有一个节点")
	}
	temp := head
	helper := head

	// 如果头节点就是要删除的节点
	if temp.Ele == ele {
		// 找到链表的最后一个节点
		for helper.Next != head {
			helper = helper.Next
		}
		// 将最后一个节点的Next指向头节点的下一个节点
		helper.Next = temp.Next
		// 更新头节点
		head = temp.Next
		return head, nil
	}

	// 遍历链表查找要删除的节点
	for temp.Next != head {
		if temp.Next.Ele == ele {
			// 找到要删除的节点
			temp.Next = temp.Next.Next
			return head, nil
		}
		temp = temp.Next
	}

	// 如果没有找到要删除的节点
	return head, fmt.Errorf("删除失败，没有找到要删除的节点")
}
